package com.tkm.types.classes

import org.jetbrains.annotations.TestOnly

class Person(age: Int, name: String) {
    //  Kotlin中，成员属性默认为一个field，一个setter（var声明，val声明则没有）、一个getter
    //  实际开发中，如果没有特殊要求，则无需重写setter/getter
//    var age: Int = age
//    var name: String = name

    //  重写var属性的getter、setter
    var age: Int = age
        get() {
            println("age getter called")
            return field
        }
        set(value) {
            println("age setter called")
            field = value
        }

    var name: String = name
        get() {
            println("name getter called")
            return field
        }
        set(value) {
            println("name setter called")
            field = value
        }

    //  重写val属性的getter
    val id: String
        get() {
            println("id getter called")
            return "${age.hashCode()}${name.hashCode()}"
        }
}

fun main() {
    val person = Person(24, "TKM")
    println(person.id)
    person.age = 25
    person.name = "TKM"
    println(person.id)

    //  属性引用，类似函数引用
    //  未绑定receiver，则需要传入receiver
    val ageRef = Person::age
    ageRef.set(person, 114)
    println(ageRef.get(person))

    //  已绑定receiver，则无需传入receiver
    val nameRef = person::name
    nameRef.set("TKM")
    println(nameRef.get())
}
